/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.me.sd;

/**
 *
 * @author jorge
 */
public class ParserNode {

    private String valor;

    private static final int OFFSET = 'a';

    private static final int DIM = 'z'-'a'+1;

    private int numChildren=0;

    /** Maxima profundidade do nó*/
    private int maxProfundidade=0;
    
    /** N.º de vezes que a palavra é inicio */
    private int numInicios = 0;

    /** N.º de vezes em que o nó está no meio da palavra*/
    private int numMeios = 0;

    /** N.º de vezes em que o nó finaliza a palavra */
    private int numFins = 0;

    /** Vector com os nós filhos*/
    private ParserNode [] nos = new ParserNode[DIM];

    public ParserNode() {
    }


    private void actualizarStats (boolean isInicio,boolean isFim,boolean isMeio){
            boolean b = false;
            if(isInicio){
                numInicios++;
                b = true;
            }
            if(isFim){
                numFins++;
                b=true;
            }
            if(!b){
                numMeios ++;
            }
            
    }

    public void put(String valor,char [] s, boolean isInicio,boolean isFim,boolean isMeio){
        this.valor = valor;
        if(s==null || s.length==0){
            actualizarStats(isInicio, isFim, isMeio);
            return;
        }
        int c = s[0]-OFFSET;
        ParserNode n = nos[c];
        if(n==null){
            n = new ParserNode();
            numChildren++;
            nos[c] = n;
        }
        if(s.length> maxProfundidade){
             maxProfundidade = s.length;
        }
        n.put(s[0]+"",Parser.subChar(s, 1, s.length), isInicio, isFim, isMeio);
    }

    @Override
    public String toString() {
        StringBuilder builder =  new StringBuilder();
        builder.append(valor);
        builder.append("(");
        if(valor.length()==1){
            builder.append(valor.charAt(0)-OFFSET);
        }
        builder.append(")");
        builder.append("\t)");
        builder.append(" N.Inicios : ");
        builder.append(numInicios);
        builder.append(" N.Meios : ");
        builder.append(numMeios);
        builder.append(" N.Fins : ");
        builder.append(numFins);
        builder.append(" Max Profundidade : ");
        builder.append(maxProfundidade);
        builder.append('\n');
        for(ParserNode node : nos){
            if(node!=null){
                builder.append(valor);
                builder.append(node);
                builder.append('\n');
            }
        }
        return builder.toString();
    }

    public int getMaxProfundidade() {
        return maxProfundidade;
    }

    public ParserNode[] getNos() {
        return nos;
    }

    public int getNumFins() {
        return numFins;
    }

    public int getNumInicios() {
        return numInicios;
    }

    public int getNumMeios() {
        return numMeios;
    }

    public String getValor() {
        return valor;
    }

    public void setNos(ParserNode[] nos) {
        this.nos = nos;
    }

    public void setNumFins(int numFins) {
        this.numFins = numFins;
    }

    public void setValor(String valor) {
        this.valor = valor;
    }

    public void setNumMeios(int numMeios) {
        this.numMeios = numMeios;
    }

    public void setMaxProfundidade(int maxProfundidade) {
        this.maxProfundidade = maxProfundidade;
    }

    public void setNumInicios(int numInicios) {
        this.numInicios = numInicios;
    }

    public int getNumChildren(){
        return numChildren;
    }

}
